
// TypeScript中类的用法
/**
 * 1、访问修饰符
 *  public：任何地方都可见，默认
 *  private：只在类内部可见
 *  protected：类内部或子类中可见
 * 2、readonly
 *  只能通过构造方法赋值一次
 * 3、抽象类
 *  可以包含抽象方法
 *  不可以有实例
 */

class A {
  m1: string;
  public readonly m2: string;
  protected m3: string;
  private m4: string;
  constructor (m1:string, m2: string, m3: string, m4: string) {
    this.m1 = m1;
    this.m2 = m2;
    this.m3 = m3;
    this.m4 = m4;
  }
  toString() {
    return `m1=${this.m1} -- m2=${this.m2} -- m3=${this.m3} -- m4=${this.m4}--`
  }
}

class AA extends A {
  test() {
    console.log(this.m3)
  }
}

const a = new A('a', 'b', 'c', 'd')

console.log(a.m1, a.m2)
console.log(a.m1, a.m2)
//console.log(a.m3, a.m4)  //不可以
// a.m2 = 'xxx' //不可以

const aa = new AA('aa', 'bb', 'cc', 'dd')

// abstract class AAA {
//     m1: string;
//     test1 () {
//         //只有能有方法的描述，而没有方法体的实现
//         abstract test2()
//     }
// }
abstract class AAA {
    m1: string | undefined;
    test1 () {}
}

// class BB extends AAA {
// class BB implements AAA {
//   m1: string = 'hello'
//   test1 () {
//     return 'hello'
//   }
// }

// let b = new BB()
// b.test1()


//const aaa = new AAA()  //不可以

//实现类 抽象类
//抽象方法：有abstract / 没有方法体 / 不能创建实例
//实现方法：没有abstract / 有方法体 / 可以创建实例


export {}